package admin;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

import database.IDbConnector;
import database.MySQLConnector;

import model.Member;
import model.Params;
import model.Room;
import model.Stats;


/**
 * <p>Title: memberModel </p>
 *
 * <p>
 * 	Description: Cette classe est le model d'une javax.swing.JTable, elle sert a peupler la liste (JTable)
 *  de membres
 * </p>
 *
 * <p>Copyright: (c) 2008 FSSIM</p>
 *
 * <p>Company: FSSImock</p>
 *
 * @author Antoine Farnault
 * @author Aubry Pirian
 * @version 2.0
 */
public class MemberModel extends AbstractTableModel implements TableModel{

	private static final long serialVersionUID = 1L;
	private JTable tableData;
	Vector<Object> rowData = new Vector<Object>(); // Une ligne de la table
	
	private IDbConnector idbc;
	
	private Vector<String> newRow = new Vector<String>();
	private int maxId;
	
	private static final int ID_COL = 0;
	private static final int LOGIN_COL = 1;
	private static final int EMAIL_COL = 2;
	private static final int FIRSTNAME_COL = 3;
	private static final int LASTNAME_COL = 4;
	private static final int GENDER_COL = 5;
//	private static final int RANK_COL = 6;
	private static final int STATUS_COL = 6;
	private static final int DATE_REG_COL = 7;
	private static final int GOOD_ANSWERS_COL = 8;
	private static final int CONNECTIONS_COL = 9;
	
//	private static final Integer[] DELETERS = {};
//	private static final String DELETE_CODE = "delete";
	
	
	public MemberModel() {
		super();
		this.maxId = -1;
		try {
			this.idbc = new MySQLConnector(Params.DB_SERVER,Params.DB_USER,Params.DB_PASSWD,Params.DB_NAME);
			this.idbc.connect();
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			ResultSet rs = this.idbc.select(Params.MEMBER_TABLE);
			while (rs.next()) {
				Member m = new Member(rs.getInt("id"));
				if (rs.getInt("id")>this.maxId) this.maxId=rs.getInt("id");
				rowData.add(m);
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(this.rowData);
	}

	
	/**
	 * Sauve la JTable parente
	 * @param jt : JTable parente
	 */
	public void setJTable (JTable jt) {
		this.tableData = jt;
	}
	
	/**
	 * Redefinition de la methode getColumnName de AbstractTableModel
	 * Elle donne automatiquement les noms des colonnes
	 * @param column le numero de colonne dont il faut le nom
	 * @return column le nom de la colonne
	 */
	@Override
	 public  String getColumnName(int column) {
         if (column == ID_COL) return "N°";
         if (column == LOGIN_COL) return "Login";
         if (column == EMAIL_COL) return "E-mail";
         if (column == FIRSTNAME_COL) return "Prénom";
         if (column == LASTNAME_COL) return "Nom";
         if (column == GENDER_COL) return "Sexe";
//         if (column == RANK_COL) return "Rang";
         if (column == STATUS_COL) return "Statut";
         if (column == DATE_REG_COL) return "Date d'inscription";
         if (column == GOOD_ANSWERS_COL) return "Bonnes réponses";
         if (column == CONNECTIONS_COL) return "Connexions";
         return "";
	 }
	
	/**
	 * Redefinition de la methode getColumnCount de AbstractTableModel
	 * Elle donne le nombre de colonnes de la table
	 * @return le nombre de colonne
	 */
	@Override
	public int getColumnCount() {
//		return 11;
		return 10;
	}
	
	/**
	 * redefinition de la methode getRowCount de AbstractTableModel
	 * Elle donne automatiquement le nombre de lignes de la table
	 * @return le nombre de lignes
	 */
	@Override
	public int getRowCount() {
		return rowData.size();
	}
	
	/**
	 * redefinition de la methode getValueAt de AbstractTableModel
	 * Elle donne la valeur d'une cellule de la table
	 * @param i le numero de ligne
	 * @param j le numero de la colonne
	 * @return l'objet a la ligne i et colonne j
	 */
	@Override
	public Object getValueAt(int i, int j) {
//		if (i==0) return newRow.get(j);
		Object o = rowData.get(i);
		if (o instanceof Vector) {
			// 1e ligne
			return newRow.get(j);
		}
		if (o instanceof Member) {
			Member m = (Member) o;
			if (j == ID_COL)		return m.getId();
			if (j == LOGIN_COL)		return m.getLogin();
			if (j == EMAIL_COL)		return m.getEmail();
			if (j == FIRSTNAME_COL)	return m.getFirstName();
			if (j == LASTNAME_COL)	return m.getLastName();
			if (j == GENDER_COL) {
				char c = m.getGender();
				if (c==Params.BLANK_GENDER) return "";
				else return c;
			}
//			if (j == RANK_COL)		return m.getRank();
			if (j == STATUS_COL)	return m.getStatus();
			if (j == DATE_REG_COL)	return m.getDateRegistered();
			if (j == GOOD_ANSWERS_COL)
				try {
					return m.getGoodAnswers()+" %";
				} catch (SQLException e) {
					System.out.println("Erreur SQL n°"+e.getErrorCode()+": "+e.getMessage());
				} catch (NoSuchFieldException e) {
					System.out.println("Paramètre non valide");
				}
			if (j == CONNECTIONS_COL)
				try {
					return Stats.getMemberConnections(m.getId());
				} catch (ClassNotFoundException e) {
					System.out.println("Impossible de se connecter à la base de données (driver JDBC non disponible)");
				} catch (SQLException e) {
					System.out.println("Erreur SQL n°"+e.getErrorCode()+": "+e.getMessage());
				} catch (NoSuchFieldException e) {
					System.out.println("Paramètre non valide");
				}
		}
		return "Error";
	}
	
	/**
	 * Redefinition de la méthode setValueAt de AbstractTableModel
	 * Elle enregistre la valeur entrée
	 * @param o objet à enregistrer
	 * @param i le numero de ligne
	 * @param j le numero de la colonne
	 */
	@Override
	public void setValueAt(Object o, int i, int j) {
		/*
		// A décommenter si un numéro de membre devient modifiable
		if (i==0) {
			this.saveNewRow(o);
			return;
		}*/
		String s = (String) o;
		/*
		 // A décommenter si un membre devient supprimable 
		if ( Utils.inArray( DELETERS, j) && s.equalsIgnoreCase(DELETE_CODE) ) {
			this.deleteRow(i);
			return;
		}*/
		Member m = (Member) this.rowData.get(i);
		if (j==LOGIN_COL) {
			try {
				m.setLogin(s);
			} catch (NoSuchFieldException e) {
				System.out.println("Paramètre non valide");
			} catch (SQLException e) {
				System.out.println("Erreur SQL n°"+e.getErrorCode()+": "+e.getMessage());
			}
			return;
		}
		if (j==EMAIL_COL) {
			try {
				m.setEmail(s);
			} catch (NoSuchFieldException e) {
				System.out.println("Attribut non valide");
			} catch (SQLException e) {
				System.out.println("Erreur SQL n°"+e.getErrorCode()+": "+e.getMessage());
			}
			return;
		}
		if (j==FIRSTNAME_COL) {
			try {
				m.setFirstname(s);
			} catch (NoSuchFieldException e) {
				System.out.println("Attribut non valide");
			} catch (SQLException e) {
				System.out.println("Erreur SQL n°"+e.getErrorCode()+": "+e.getMessage());
			}
			return;
		}
		if (j==LASTNAME_COL) {
			try {
				m.setLastname(s);
			} catch (NoSuchFieldException e) {
				System.out.println("Attribut non valide");
			} catch (SQLException e) {
				System.out.println("Erreur SQL n°"+e.getErrorCode()+": "+e.getMessage());
			}
			return;
		}
		if (j==GENDER_COL) {
			try {
				m.setGender(s);
			} catch (NoSuchFieldException e) {
				System.out.println("Attribut non valide");
			} catch (SQLException e) {
				System.out.println("Erreur SQL n°"+e.getErrorCode()+": "+e.getMessage());
			}
			return;
		}
		/*
		if (j==RANK_COL) {
			//TODO : vérifier le rang reçu
			try {
				m.setRank(s);
			} catch (NoSuchFieldException e) {
				System.out.println("Attribut non valide");
			} catch (SQLException e) {
				System.out.println("Erreur SQL n°"+e.getErrorCode()+": "+e.getMessage());
			}
			return;
		}
		*/
		if (j==STATUS_COL) {
			try {
				m.setStatus(s);
			} catch (NoSuchFieldException e) {
				System.out.println("Attribut non valide");
			} catch (SQLException e) {
				System.out.println("Erreur SQL n°"+e.getErrorCode()+": "+e.getMessage());
			}
			return;
		}
	}
	
	/**
	 * Supprime la ligne i
	 * @param i ligne à supprimer
	 */
	public void deleteRow (int i) {
		Room r = (Room) this.rowData.get(i);
		try {
			r.delete();
			this.rowData.remove(i);
		} catch (NoSuchFieldException e) {
			System.out.println("Paramètre invalide.");
		} catch (SQLException e) {
			System.out.println("Erreur SQL n°"+e.getErrorCode()+": "+e.getMessage());
		}
		this.tableData.updateUI();
	}
	
	/**
	 * Indique si une case est éditable
	 * @param row		: ligne de la case
	 * @param column	: colonne de la case
	 */
	@Override
	public boolean isCellEditable(int row, int column){
		if (column==ID_COL) return false;
		if (column==DATE_REG_COL) return false;
		if (column==GOOD_ANSWERS_COL) return false;
		if (column==CONNECTIONS_COL) return false;
		return true;
	}
}
